
// var Fn = function (args) {

//   this.attr =args;
// };
// var Person = function () {};
// Person.prototype.run = function () {
//   console.log('person')
// };
// //construct的第一个参数为构造函数， 第二个参数由参数组成的数组或者伪数组(只会拿第一个元素当做参数)  第三个参数为一个超类， 新元素会继承这个超类；
// // console.log(Reflect.construct(Fn, [], Person));
// var ceshi=Reflect.construct(Fn, ['ceshi','fasd'], Person)


// 定义一个空类进行缓存
var aaa=function(){
  this.aa=111
}
var b=function(){
  this.b=2
}
b.prototype=new aaa()  //原型继承



//////////////////////////   如何巧妙的利用空类
function Person(name,age){ //  这个里面的都是相当于类变量
  this.name = name;
  this.age = age;
}
Person.prototype = {  // 这个里面定义的都是实例属性
  constructor:Person,
  sayHi:function(){
      alert('hi');
  }
}

function Student(name,age,grade){
  Person.call(this,name,age);
  this.grade = grade;
}



// function Empty(){}
// Empty.prototype = Person.prototype;

//  Student.prototype = new Empty();

// Student.prototype.constructor = Student;

// Student.prototype=new Person()   
// Student.prototype=Person.prototype  //如果直接这样继承的话,会修改父类的原型链
Student.prototype.dohomeWork=function(){
  console.log('我正在做作业')
}
var p1 = new Person('xiaoming',10);
var s1 = new Student('xiaohong',9,3);
console.log(p1);//Person { name="xiaoming", age=10, sayHi=function()}
console.log(s1);//Student {name="xiaohong", age=9, grade=3, 更多...}
// console.log(p1.constructor);//Person(name,age) 父类的实例指向仍是父类
// console.log(s1.constructor);//Student(name,age,grade) //子类的实例指向仍是子类